<?php
/**
 * Controller de Datos.
 *
 *
 * @filesource          
 * @copyright		
 * @link		http://www.pragmatia.com Pragmatia
 * @package		datagro
 * @subpackage	app.controllers
 * @version     1.1
 * @license		http://www.opensource.org/licenses/mit-license.php The MIT License
 * @author      Martin Radosta <mradosta@pragmatia.com>
 */

/**
 * Clase DatosController
 *
 * @package	    datagro
 * @subpackage	app.controllers
 */

class DatosController extends AppController
{
    var $name = 'Datos';
	var $uses = array('Dato', 'Comando', 'Falla', 'Parametro', 'AlertasCliente', 'Alerta');
	//var $components = array('Mailer', 'Zip');
	var $components = array('Mailer');  
	var $parametros;


/**
 * Delete.
 *
 */
   function delete($id = false) 
   {
        if ($id && is_numeric($id))
        {
			//$detalles = $this->Dato->DetalleDato->findAll(array("DetalleDato.dato_id"=>$id));
			$dato = $this->Dato->findById($id);

			if (!empty($dato['DetalleDato'][0]['encabezado_dato_id'])) {
				$this->Dato->delete($dato['DetalleDato'][0]['encabezado_dato_id']);
				$this->Dato->DetalleDato->deleteAll(array('DetalleDato.encabezado_dato_id' => $dato['DetalleDato'][0]['encabezado_dato_id']));
			}
			if ($this->Dato->delete($id))
			{
				$this->Session->setFlash('El registro se borro correctamente.', 'ok');
			}
			else
			{
				$this->Session->setFlash('No fue posible borrar el registro.', 'error');
			}
        }    
		$this->redirect('index', null, true);
   }
   	
	/* Dejo un log */
	function log($msg, $file = null) {
		if(is_array($msg)) {
			ob_start();
			debug($msg);
			$msg = false;
			$msg = ob_end_clean();
		}
		file_put_contents("log.txt", "\n\n" . date("d/m/Y H:i:s") . "\n" . $msg, FILE_APPEND);
		if(!empty($file)) {
			file_put_contents($file, "\n\n" . date("d/m/Y H:i:s") . "\n" . $msg, FILE_APPEND);
		}
	}
	
	function r($validacion, $datos) {
		$this->log("Validacion: " . $validacion . "\nDatos: " . $datos);

		if(empty($validacion) || strlen($validacion) <> 15 || !is_numeric($validacion)) {
			die();
		} else {
			$sim = $this->Dato->Sim->findByImsi($validacion);
			if(empty($sim)) {
			}
		}

		$datosArray = explode("**", $datos);

		$comando = "";
		$search = $this->Comando->find(array("conditions"=>array("Comando.sim_id"=>$sim['Sim']['id'], "Comando.estado"=>"36")));
		if(!empty($search['Comando']['comando'])) {
			$comando = "|" . $search['Comando']['comando'] . "|";
		}

		//$this->parametros = array_flip($this->Parametro->generateList(null, null, null, null, "{n}.Parametro.identificador"));

		$this->log("Se procesaran " . count($datosArray) . " paquetes");
		foreach($datosArray as $k=>$vvv) {
			$save = $dato = $detalle = null;
			$datos = $vvv;
			
			$tipo = substr($datos, 0, 1);

			/**
			* Elimino el 0D del final que avces viene y otras no.
			*/
			if(substr($datos, -2) == "0D") {
				$datos = substr($datos, 0, strlen($datos)-2);
			}

			$registro = explode("|", $datos);
			$secuencia = substr($registro[0], 1);
			
			if(($tipo == "E" || $tipo == "D" || $tipo == "I") && is_numeric($secuencia)) {
				if($tipo == "E" && count($registro) <> 8) {
					$respuesta[$k] = "OKNO";
					$this->log("Encabezado sin 8 campos => sale");
					continue;
				}
				$save['tipo'] = $tipo;
				$save['secuencia'] = $secuencia;
			}
			elseif($tipo == "F") {
				$save['tipo'] = $tipo;
			}
			else {
				$respuesta[$k] = "OKNO";
				$this->log("Paquete que no es ni E, ni D, ni F => sale");
				continue;
			}
			


			$save['fecha_hora_recepcion'] = date("Y-m-d H:i:s");
			$save['validacion'] = $validacion;
			$save['registro'] = $datos;
			$save['sim_id'] = $sim['Sim']['id'];
			

			/**
			* Saco la Fecha.
			*/
			if(isset($registro[1]) && is_numeric($registro[1]) && strlen($registro[1]) == 6) {
				$vFecha = str_split($registro[1], 2);
				if(count($vFecha) == 3) {
					$detalle['W'] = $vFecha[0] . "/". $vFecha[1] . "/20" . $vFecha[2];
					$save['fecha'] = "20" . $vFecha[2] . "-" . $vFecha[1] . "-" . $vFecha[0];
				}
			}

			/**
			* Saco la Hora.
			*/
			if(isset($registro[2]) && is_numeric($registro[2]) && strlen($registro[2]) == 6) {
				$vHora = str_split($registro[2], 2);
				if(count($vHora) == 3) {
					$detalle['V'] = implode(":", $vHora);
					$save['hora'] = $detalle['V'];
				}
			}

//http://127.0.0.1/cake/datagro2/datos/r/722310005824199/D05|030708|160629|-34.145301|-63.387646|O050**D05|030708|160639|-34.145284|-63.387641|O050**E05|030708|160649|D|DD|||000**I05|030708|160649|-34.145324|-63.387661|121212|232323|343434|45.5|56**D05|030708|160659|-34.145311|-63.387634|C289|D051864|E041492|F040607|G750|H82|O0500D
//http://www.datagro.com.ar/datos/r/722310005824199/D05|030708|160629|-34.145301|-63.387646|O050**D05|030708|160639|-34.145284|-63.387641|O050**E05|030708|160649|D|DD|||000**I05|030708|160649|-34.145324|-63.387661|121212|232323|343434|45.5|56**D05|030708|160659|-34.145311|-63.387634|C289|D051864|E041492|F040607|G750|H82|O0500D

			foreach($this->Parametro->findAll() as $v) {
				$this->parametros[$v['Parametro']['identificador']]['id'] = $v['Parametro']['id'];
				$this->parametros[$v['Parametro']['identificador']]['max'] = $v['Parametro']['valor_maximo'];
				$this->parametros[$v['Parametro']['identificador']]['min'] = $v['Parametro']['valor_minimo'];
				$this->parametros[$v['Parametro']['identificador']]['nombre'] = $v['Parametro']['nombre'];
				$this->parametros[$v['Parametro']['identificador']]['unidad'] = $v['Parametro']['unidad'];
			}

			switch($tipo) {
				//$Inro de secuencia|Fecha|Hora|Latitud|Longitud|Total de hectareas|Total toneladas|Rendimiento promedio|Humedad promedio|Temperatura promedio
				case "I":
					$buscar = array("Dato.tipo"=>"E", "Dato.secuencia"=>$secuencia, "Dato.validacion"=>$validacion);
					$this->Dato->expects();
					$ultimo = $this->Dato->find($buscar, "max(Dato.id) as ultimo");
					$save['dato_id'] = $ultimo[0]['ultimo'];
					
					$detalle['A'] = $registro[3];
					$detalle['B'] = $registro[4];
					$detalle['X'] = $registro[5];
					$detalle['Y'] = $registro[6];
					$detalle['Z'] = $registro[7];
					$detalle['a'] = $registro[8];
					$detalle['b'] = $registro[9];
					$detalle = $this->__asignarId($detalle, "I", $ultimo[0]['ultimo']);
					
					break;
					
				//ESeq|Fecha|Hora|Campo|Lote|Cultivo|Variedad|LAncho_Plataforma
				//0	  |1    |2   |3	   |4	|5		|6		 |LAncho_Plataforma
				case "E":
					/**
					* Verifico que no este repetido.
					*/
					$find = $save;
					unset($find['fecha_hora_recepcion']);
					unset($find['hora']);
					unset($find['fecha']);
					$r = null;
					for($i=3;$i<count($registro);$i++) {
						$r[] = $registro[$i];
					}
					$find['registro'] = "like %|" . implode("|", $r) . "%";
					$this->Dato->expects();
					$findResultado = $this->Dato->findAll($find);
					if(!empty($findResultado)) {
						$respuesta[$k] = "OKNO";
						$this->log("Encabezado Duplicado => sale");
						continue 2;
					}
					//http://127.0.0.1/cake/datagro2/datos/r/722310401343253/E03|161107|101907|AAAAAAAAAA|BBBBBBB|GIRASOL|CCCCCC|1008569|F008594|G921|H24/*0D*/
					if(count($registro) >= 7) {
					
						$detalle['T'] = empty($registro[6])?"S/ Variedad":$registro[6];
						$detalle['U'] = empty($registro[5])?"S/ Cultivo":$registro[5];
						$detalle['S'] = empty($registro[4])?"S/ Lote":$registro[4];
						$detalle['R'] = empty($registro[3])?"S/ Campo":$registro[3];
						$detalle['J'] = $registro[7] / 10;

						$linea = "";
						for($i=8; $i<count($registro); $i++) {
							$linea .= $registro[$i] . "|";
						}
						$detalle = array_merge($detalle, $this->__getValores($linea));
						$detalle = $this->__asignarId($detalle, "E");
						
					}
					break;
				case "D":
					//http://localhost/datagro2/datos/r/722310401343253/D03|161107|101918|-34.145778|-63.387786|C542|D000000|E038569|F008594|G921|H24|I100|J100|K001|L100|M572|N231|O8250D
					//http://localhost/datagro2/datos/r/722310401343253/D19|261107|173222|-34.141376|-63.393224|C760|D000000|E004633|F051561|G000|H25|I100|J100|K000|L100|M000|N164|O8940D

					$buscar = array("Dato.tipo"=>"E", "Dato.secuencia"=>$secuencia, "Dato.validacion"=>$validacion, "Dato.fecha" => ">= " . date('Y-m-d', (time() - (30*24*60*60))));
					$this->Dato->expects();
					$ultimo = $this->Dato->find($buscar, "max(Dato.id) as ultimo");
					if (empty($ultimo[0]['ultimo'])) {
						$ultimo[0]['ultimo'] = 0;
					}

					$save['dato_id'] = $ultimo[0]['ultimo'];
					$linea = "";
					for($i=5; $i<count($registro); $i++) {
						$linea .= $registro[$i] . "|";
					}

					/** Si la latitud o la longitud no son numeros validos, descarto el registro */
					if (!is_numeric($registro[3]) || !is_numeric($registro[4])) {
						continue;
					}
					
					$detalle['A'] = $registro[3];
					$detalle['B'] = $registro[4];
					$detalle = array_merge($detalle, $this->__getValores($linea));
					$detalle = $this->__asignarId($detalle, "D", $ultimo[0]['ultimo']);
					
					foreach($detalle['DetalleDato'] as $k=>$v) {
						if(isset($this->parametros[$v['identificador']]['id']) 
							&& !empty($this->parametros[$v['identificador']]['max']) 
							&& !empty($this->parametros[$v['identificador']]['min'])) {
							if($v > $this->parametros[$v['identificador']]['max'] || $v < $this->parametros[$v['identificador']]['min']) {
								$this->log("Fuera de Rango: " . $k . ": " . $v['valor'], "log_rangos.txt");
								$this->log("Minimo: " . $this->parametros[$v['identificador']]['min'] . ", Maximo: " . $this->parametros[$v['identificador']]['max'], "log_rangos.txt");
								die();
							}
						}
					}
					break;
			}

			if ($tipo == "F") {
				$save['usuario_id'] = $sim['Sim']['usuario_id'];
				$save['equipo_id'] = $sim['Equipo']['id'];
				$save['latitud'] = $registro[3];
				$save['longitud'] = $registro[4];
				$save['falla'] = $registro[5];
				$save['comando_id'] = $registro[6];
				$falla = array('Falla' => $save);
				$this->Falla->create();
				$this->Falla->save($falla);
			} else {

				$dato = array('Dato' => $save);
				$this->Dato->create();
				$save = array_merge($dato, $detalle);

				if($this->Dato->save($save)) {
					$this->log($save);
					$save['Dato']['id'] = $this->Dato->getLastInsertID();


					/** Busco si tengo D sin E en los 30 dias previos que concuerden con este y los actualizo */
					if ($tipo == "E") {
						$this->Dato->expects();
						$details = $this->Dato->findAll(array(
							'Dato.tipo' 		=> 'D',
							'Dato.secuencia' 	=> $save['Dato']['secuencia'],
							'Dato.validacion' 	=> $save['Dato']['validacion'],
							'Dato.fecha' 		=> '>= ' . date('Y-m-d', (time() - (30*24*60*60))),
							'Dato.dato_id' 		=> '0'));

						if (!empty($details)) {
							foreach ($details as $detail) {
								$ids[] = $detail['Dato']['id'];
							}
							$this->Dato->updateAll(array('dato_id' => $save['Dato']['id']), array('id' => $ids));
							$this->Dato->DetalleDato->updateAll(array('encabezado_dato_id' => $save['Dato']['id']), array('dato_id' => $ids));
						}
					}
					
					$alertas = $this->AlertasCliente->findAll(array("AlertasCliente.tipo_equipo"=>35, "AlertasCliente.estado"=>"Vigente", "AlertasCliente.usuario_id"=>$sim['Sim']['usuario_id'], "fecha_vigencia_desde"=>"<=" . date("Y-m-d H:m:s"), array('OR'=>array(array("fecha_vigencia_hasta"=>">" . date("Y-m-d H:m:s")), array("fecha_vigencia_hasta"=>null)))));
					if(!empty($alertas)) {
							$this->log("Se encontraron alertas vigentes...");
							$this->enviarAlerta($alertas, $save);
					}
				}
			}
			if(!empty($comando)) {
				$search = $this->Comando->save(array("Comando.sim_id"=>$sim['Sim']['id'], "Comando.estado"=>"37"));
			}
			$respuesta[$k] = "OK";
		}//foreach
		$ok = true;
		foreach($respuesta as $k=>$v) {
			if($v == "OKNO") {
				$ok = false;
				$idsOKNO[] = $k;
			}
		}
		if(!$ok) {
			$res = "OKNO"  . implode("", $idsOKNO);
		}
		else {
			$res = "OK";
		}
		$res .= $comando;

		
		$this->log("Respuesta " . $res);
		die($res);
	}



	function enviarAlerta($alertas, $save)
	{
		$log = array();
		foreach($alertas as $v) {
			$criterios = unserialize($v['AlertasCliente']['contenido']);
			$encabezadoA = true;
			$detalleA = false;
			if($save['Dato']['tipo'] == "D" && $save['Dato']['dato_id'] > 0) {
				$this->Dato->recursive = -1;
				$header = $this->Dato->findById($save['Dato']['dato_id']);
			}
			else {
				$header = $save;
			}
			
			$cantidadCriterioDetalle = 0;
			$cantidadCriterioDetalleOK = array();
			foreach($criterios as $criterio) {
				
				$criterio['valor'] = strtolower($criterio['valor']);
				if($criterio['etiqueta'] < 19 || $criterio['etiqueta'] > 22) {
					$cantidadCriterioDetalle++;
					$hayDetalle = true;
					foreach($save['DetalleDato'] as $detalle) {
						//unifico formato de valores
						if(preg_match("/(\d\d)\/(\d\d)\/(\d\d\d\d)/", trim($detalle['valor']), $matches)) {
							unset($matches[0]);
							$detalle['valor'] = implode("-", array_reverse($matches));
						}
						else {
							$detalle['valor'] = strtolower($detalle['valor']);
						}
						//unifico formato de criterios
						if(preg_match("/(\d\d)\/(\d\d)\/(\d\d\d\d)/", trim($criterio['valor']), $matches)) {
							unset($matches[0]);
							$criterio['valor'] = implode("-", array_reverse($matches));
						}
						else {
							$criterio['valor'] = strtolower($criterio['valor']);
						}
						if($detalle['parametro_id'] == $criterio['etiqueta']) {
							$this->log("Criterio: " . $criterio['valor']);
							$this->log("Operador: " . $criterio['operador']);
							$this->log("Valor: " . $detalle['valor']);
							switch ($criterio['operador']) {
								case "mayor":
									if($detalle['valor'] > $criterio['valor']) {
										$cantidadCriterioDetalleOK[] = true;
										break;
									}
								break;
								case "menor":
									if($detalle['valor'] < $criterio['valor']) {
										$cantidadCriterioDetalleOK[] = true;
										break;
									}
								break;
								case "mayorigual":
									if($detalle['valor'] >= $criterio['valor']) {
										$cantidadCriterioDetalleOK[] = true;
										break;
									}
								break;
								case "menorigual":
									if($detalle['valor'] <= $criterio['valor']) {
										$cantidadCriterioDetalleOK[] = true;
										break;
									}
								break;
								case "igual":
									if($detalle['valor'] == $criterio['valor']) {
										$cantidadCriterioDetalleOK[] = true;
										break;
									}
								break;
								case "distinto":
									if($detalle['valor'] != $criterio['valor']) {
										$cantidadCriterioDetalleOK[] = true;
										break;
									}
								break;
							} //switch
							break;
						}
					}
				}
				else {
					if(stripos($header['Dato']['registro'] . "|", "|" . $criterio['valor'] . "|") === false) {
						$encabezadoA = false;
					}
				}
			}
			if(!isset($hayDetalle) || count($cantidadCriterioDetalleOK) == $cantidadCriterioDetalle) {
				$detalleA = true;
			}
			
			$this->log("Alerta encabezadoA " . $encabezadoA);
			$this->log("Alerta detalleA " . $detalleA);
			if($encabezadoA && $detalleA) {

				if(isset($v['Alerta']['0']['fecha'])) {
					$minutos = $this->datediff("n", $v['Alerta']['0']['fecha'], date("Y-m-d H:i:s"), false);
					/** si ya envie una alerta en menos de este tiempo, no la envio de nuevo **/
					if($minutos < $v['AlertasCliente']['tiempo_delay']) {
						$this->log("No sale Alerta por tiempo Minimo. La alerta anterior salio el " . $v['Alerta']['0']['fecha'] . ", hace " . $minutos . " y el tiempo minimo de la alerta es ". $v['AlertasCliente']['tiempo_delay']);
						continue;
					}
				}
				$this->log("Sale alerta.");
				$alerta['alerta_cliente_id'] = $v['AlertasCliente']['id'];
				$alerta['usuario_id'] = $v['AlertasCliente']['usuario_id'];
				$alerta['fecha'] = date("Y-m-d H:i:s");
				$alerta['dato_id'] = $save['Dato']['id'];
				$alerta['sim_id'] = $save['Dato']['sim_id'];

				//creo el texto del mail
				$envioMail = false;
				$texto = "";
				if(!empty($v['Cliente']['nombre'])) {
					$nombre = $v['Cliente']['nombre'];
				}
				else {
					$nombre = $v['Usuario']['nombre'];
				}

				$texto .= "Estimado Sr/a <b>" . $nombre . "</b>:<br/><br/>";
				$texto .= "Nos comunicamos con usted para hacerle saber que la alerta <b>" . $v['AlertasCliente']['nombre'] . "</b> que usted ha configurado en nuestros sistemas se ha accionado.<br/>";
				
				$texto .= "El dato que desencadeno la alerta es de fecha <b>" . $this->Formato->formatearFechaHora($save['Dato']['fecha']) . "</b><br/><br/>";

				$texto .= "<br/>";
				$texto .= "A continuacion se adjunta el detalle:";
				$texto .= "<br/>";

				$texto .= "<table border=1>";
				foreach($save['DetalleDato'] as $k2=>$v2)
				{
					$texto .= "<tr>";
					$texto .= "<td>";
					if(isset($this->parametros[$v2['identificador']]['nombre'])) {
						$texto .= $this->parametros[$v2['identificador']]['nombre'];
					}
					else {
						$texto .= $v2['parametro_id'];	
					}
					$texto .= "</td>";
					$texto .= "<td>";
					$texto .= "<b>" . $v2['valor'] . "</b>";
					$texto .= "</td>";
					$texto .= "<td>";
					if(isset($this->parametros[$v2['identificador']]['unidad'])) {
						$texto .= $this->parametros[$v2['identificador']]['unidad'];
					}
					else {
						$texto .= "&nbsp;";	
					}
					$texto .= "</td>";
					$texto .= "</tr>";
				}

				$texto .= "</table>";
				$texto .= "<br/>";
				$texto .= "<br/>";
				$texto .= "Para mas informacion puede entrar al sistema haciendo click <a href='http://www.datagro.com.ar'>aqui</a>";
     
				$this->Mailer->From = "postmaster@datagro.com.ar";
				$this->Mailer->Sender = "postmaster@datagro.com.ar";

				$this->Mailer->FromName = "Alertas - DataAgro";
				//$this->Mailer->AddAddress($notificacion['destino']);
				$this->Mailer->Subject = "Se ha producido una nueva alerta";
				$this->Mailer->Body = $texto;
				$this->Mailer->IsHTML (true);
     
				$this->Mailer->IsSMTP( true );
				$this->Mailer->Host     = "smtp.pragmatia.com.ar";
				$this->Mailer->Mailer   = "smtp";

				$this->Mailer->SMTPAuth = true;
				$this->Mailer->Username = 'postmaster@datagro.com.ar';
				$this->Mailer->Password = 'data8877';

				$this->Alerta->save(array("Alerta"=>$alerta));
				$alerta_id = $this->Alerta->getLastInsertId();
				
				foreach($v['AlertasClienteNotificacion'] as $notificacion) {

					$saveNotificacion['notificacion'] = $notificacion['notificacion'];
					$saveNotificacion['destino'] = $notificacion['destino'];
					$saveNotificacion['alerta_id'] = $alerta_id;
					$saveNotificacion['estado'] = "E";

					$log[] = "se envio a " . $notificacion['destino'] . "( " . $v['AlertasCliente']['nombre'] . " )";
					if ($notificacion['notificacion'] == "8") //email
					{
						$this->Mailer->AddAddress($notificacion['destino']);
						$envioMail = true;
					}
					elseif($notificacion['notificacion'] == 7) //sms
					{
						for($ii=1; $ii<=20; $ii++) {
							$filename = APP . "webroot" . DS . "files" . DS . "alerta_sin_enviar" . $ii;

							if (!file_exists($filename)) {
								break;
							}
							else {
								$filename = null;
							}
						}

						if(!empty($filename)) {
							$sms = $notificacion['destino'] . "|" . "Datagro - Alertas, se ha disparado su alerta " . $v['AlertasCliente']['nombre'];
							file_put_contents($filename, $sms);
						}
					}
					$this->Alerta->AlertasNotificacion->create();
					$this->Alerta->AlertasNotificacion->save($saveNotificacion);
				}//foreach notificacion

				if($envioMail) {
					$envioMail = false;
					if(!$this->Mailer->Send()) {
						$log[] = "Mail error: " . $this->Mailer->ErrorInfo;
					}
					//$this->Mailer->ClearAllRecipients();
				}
				
			}
		}
		if(isset($log) && !empty($log)) {
			$log[] = "Salieron " . count($log) . " alertas";
			array_unshift($log, date('d/m/Y H:i:s'));
			array_unshift($log, "   ");
			array_unshift($log, " ");
			file_put_contents("alertas.txt", implode("\n", $log), FILE_APPEND);
			//file_put_contents("alertas.txt", implode("\n", $log));
		}
	}//funcion


	function __asignarId($detalles, $tipo, $encabezado_dato_id=0) {
		foreach($detalles as $k=>$v) {
			$detalle['DetalleDato'][] = array(	"parametro_id"			=>$this->parametros[$k]['id'],
												"identificador"			=>$k,
												"origen"				=>$tipo,
												"valor"					=>$v,
												"encabezado_dato_id"	=>$encabezado_dato_id);
		}
		return $detalle;
	}

	function __getValores($valor) {
		$return = array();
		if(is_string($valor)) {
			$parametros = explode("|", $valor);
		}
		elseif(is_array($valor)) {
			$parametros = $valor;
		}
		
		foreach($parametros as $k=>$v) {
			if(!empty($v)) {
				$identificador = substr($v, 0, 1);
				$return[$identificador] = substr($v, 1);
			}
		}
		return $return;
	}




/**
 * Archivos.
 * Exportar los archivos.
 *
 */
    function archivos() {
		if(!isset($this->params['pass']['file'])) {
			if($this->Session->check('Sim')) {
				$sim = $this->Session->read('Sim');
			}
			else {
				$this->Session->setFlash('Debe seleccionar un Modulo antes de continuar.', 'error');
				$this->redirect("../sims/seleccionar", null, true);
			}
				
			$filtro['Dato.sim_id'] = "= '" . $sim['Sim']['id'] . "'";
			$pp = "/(\d\d)-(\d\d)-(\d\d\d\d)\s(\d\d)\|(\d\d)/";
			$pd = "/(\d\d)\/(\d\d)\/(\d\d\d\d)\s(\d\d)\:(\d\d)/";
			if(!empty($this->data['Filtro']['Dato-fecha_hora__desde'])) {
				preg_match($pd, $this->data['Filtro']['Dato-fecha_hora__desde'], $matches);
				$filtro['Dato.desde'] = ">= '" . $matches[3] . "-" . $matches[2] . "-" . $matches[1] . " " . $matches[4] . ":" . $matches[5] . "'";
			}
			if(!empty($this->data['Filtro']['Dato-fecha_hora__hasta'])) {
				preg_match($pd, $this->data['Filtro']['Dato-fecha_hora__hasta'], $matches);
				$filtro['Dato.hasta'] = ">= '" . $matches[3] . "-" . $matches[2] . "-" . $matches[1] . " " . $matches[4] . ":" . $matches[5] . "'";
			}
			if(!empty($this->data['Filtro']['Dato-lote'])) {
				$filtro['Dato.registro'] = "LIKE 'E%|" . $this->data['Filtro']['Dato-lote'] . "|%'";
			}

			$arbol = $this->Dato->DetalleDato->getArbol($filtro);
			$this->set("arbol", $arbol);
			$this->set("abierto", 0);
		}
		else {
			$archivo_id[] = $this->params['pass']['file'];
			if(!empty($this->params['pass']['multiples'])) {
				$archivo_id = array_merge($archivo_id, explode("*", $this->params['pass']['multiples']));
			}
			$this->Dato->DetalleDato->expects();
			$dato = $this->Dato->DetalleDato->findAll(array("DetalleDato.dato_id"=>$archivo_id));
			$this->Dato->DetalleDato->expects();
			$datos = $this->Dato->DetalleDato->findAll(array("DetalleDato.origen"=>"D", "DetalleDato.encabezado_dato_id"=>$archivo_id), null, "DetalleDato.id");
			$datos = array_merge($dato, $datos);
			
			foreach($datos as $k=>$v) {
				$registros[$v['DetalleDato']['dato_id']][$v['DetalleDato']['identificador']] = $v['DetalleDato'];
			}

			$registros = $this->__generarArchivo($registros);
			$archivo = "archivo_" . date("d-m-Y") . "-" . count($registros) . ".txt";
			$ruta_archivo = APP . DS . "webroot" . DS . "files" . DS . $archivo;
			file_put_contents($ruta_archivo, join("\r\n", $registros));
			$this->set('ruta_archivo', $ruta_archivo);
			$this->Session->write('nombreArchivo', $ruta_archivo);
			$this->layout = "texto";
			$this->render("descargar");
		}
	}


/**
 * Arbol.
 * pinta arbol para seleccionar lote, cultivo.
 *
 */
    function arbol() {

		if($this->Session->check('Sim')) {
			$sim = $this->Session->read('Sim');
		}
		else {
			$this->Session->setFlash('Debe seleccionar un Modulo antes de continuar.', 'error');
			$this->redirect("../sims/seleccionar", null, true);
		}

		$p = $this->Dato->DetalleDato->Parametro->findAll(array("Parametro.identificador"=>array("E", "F", "D", "G", "O" )));
		foreach($p as $v) {
			$parametros[$v['Parametro']['identificador']] = $v['Parametro']['nombre'];
			$unidades[$v['Parametro']['identificador']] = $v['Parametro']['unidad'];
		}
    	$this->set("parametros", $parametros);
    	$this->set("unidades", $unidades);

    	$precisiones = array("3"=>"Media", "2"=>"Alta", "1"=>"Muy Alta");
    	$this->set("precisiones", $precisiones);
    	
		$filtro['Dato.sim_id'] = "= '" . $sim['Sim']['id'] . "'";
		$pp = "/(\d\d)-(\d\d)-(\d\d\d\d)\s(\d\d)\|(\d\d)/";
		$pd = "/(\d\d)\/(\d\d)\/(\d\d\d\d)\s(\d\d)\:(\d\d)/";
		if(!empty($this->params['pass']['fechaDesde'])) {
			preg_match($pp, $this->params['pass']['fechaDesde'], $matches);
			$filtro['Dato.desde'] = ">= '" . $matches[3] . "-" . $matches[2] . "-" . $matches[1] . " " . $matches[4] . ":" . $matches[5] . "'";
		}
		if(!empty($this->data['Filtro']['Dato-fecha_hora__desde'])) {
			preg_match($pd, $this->data['Filtro']['Dato-fecha_hora__desde'], $matches);
			$filtro['Dato.desde'] = ">= '" . $matches[3] . "-" . $matches[2] . "-" . $matches[1] . " " . $matches[4] . ":" . $matches[5] . "'";
		}
		if(!empty($this->params['pass']['fechaHasta'])) {
			preg_match($pp, $this->params['pass']['fechaHasta'], $matches);
			$filtro['Dato.hasta'] = "<= '" . $matches[3] . "-" . $matches[2] . "-" . $matches[1] . " " . $matches[4] . ":" . $matches[5] . "'";
		}
		if(!empty($this->data['Filtro']['Dato-fecha_hora__hasta'])) {
			preg_match($pd, $this->data['Filtro']['Dato-fecha_hora__hasta'], $matches);
			$filtro['Dato.hasta'] = ">= '" . $matches[3] . "-" . $matches[2] . "-" . $matches[1] . " " . $matches[4] . ":" . $matches[5] . "'";
		}

		if(!empty($this->params['pass']['lote'])) {
			$filtro['Dato.registro'] = "LIKE 'E%|" . $this->params['pass']['lote'] . "|%'";
		}
		if(!empty($this->data['Filtro']['Dato-lote'])) {
			$filtro['Dato.registro'] = "LIKE 'E%|" . $this->data['Filtro']['Dato-lote'] . "|%'";
		}

		//$filtro['Dato.registro'] = "LIKE 'E%|EF|%'";
		//$filtro['Dato.sim_id'] = "= '13'";
		//$filtro['Dato.registro'] = "RLIKE '^E[0-9]+\\|[0-9]+\\|[0-9]+\\|.*\\|EF\\|.*$'";
		//d($filtro);
		$arbol = $this->Dato->DetalleDato->getArbol($filtro);
		$this->set("arbol", $arbol);
		//$this->set("centro", array("A"=>"", "B"=>""));
		$this->set("abierto", 0);
		$this->set("mapa", true);
	}


    function mapa() {
		if(isset($this->params['pass']['abierto']) && isset($this->params['pass']['parametro']) && isset($this->params['pass']['file'])) {

			$colores[] = "verdeclaro";
			$colores[] = "verde";
			$colores[] = "amarillo";
			$colores[] = "naranja";
			$colores[] = "rojo";
			
			$this->data['Mapa']['correccionLat'] = "";
			$this->data['Mapa']['correccionLon'] = "";


			foreach($colores as $v) {
				$this->data['Mapa']['rango' . $v] = "true";
				if(!empty($this->params['pass']['Rango' . $v])) {
					$this->data['Mapa']['rango' . $v] = $this->params['pass']['Rango' . $v];
				}
			}
			
			if(!empty($this->params['pass']['layout'])) {
				$this->layout = $this->params['pass']['layout'];
				$this->params['pass']['isAjax'] = 1;
			}

			if(!empty($this->params['pass']['parametro'])) {
				$parametro = $this->params['pass']['parametro'];
			}
			if(!empty($this->data['Mapa']['parametro'])) {
				$parametro = $this->data['Mapa']['parametro'];
			}

			$correccionLat = $correccionLon = 0;
			if(!empty($this->params['pass']['CorreccionLat'])) {
				$correccionLat = $this->params['pass']['CorreccionLat'];
				$this->data['Mapa']['correccionLat'] = $correccionLat;
			}
			if(!empty($this->params['pass']['CorreccionLon'])) {
				$correccionLon = $this->params['pass']['CorreccionLon'];
				$this->data['Mapa']['correccionLon'] = $correccionLon;
			}
			
			$archivo_id[] = $this->params['pass']['file'];
			if(!empty($this->params['pass']['multiples'])) {
				$archivo_id = array_merge($archivo_id, explode("*", $this->params['pass']['multiples']));
			}
			$info = $this->Dato->DetalleDato->findAll(array("DetalleDato.encabezado_dato_id"=>$archivo_id, "DetalleDato.origen"=>"I"), null, "DetalleDato.id desc");
			$datos = $this->Dato->DetalleDato->findAll(array("DetalleDato.encabezado_dato_id"=>$archivo_id, "DetalleDato.origen"=>"D", "Parametro.identificador"=>array("A", "B", $parametro)));
			//d(count($datos));
			$registro['A'] = "0";
			$registro['B'] = "0";
			$maxA = -1000;
			$minA = -1000;
			$maxB = -1000;
			$minB = -1000;

			$datoId = $datos[0]['DetalleDato']['dato_id'];
			$valorMaximo = -10000000000;
			$valorMinimo = 10000000000;
			$registros = array();
			foreach($datos as $k=>$v) {
				if($datoId != $v['DetalleDato']['dato_id']) {
					$datoId = $v['DetalleDato']['dato_id'];
					if(!empty($registro[$parametro])) {
						$registro['fecha'] = $this->Formato->formatearFecha($v['Dato']['fecha']);
						$registro['hora'] = $v['Dato']['hora'];
						$registro['datoId'] = $v['DetalleDato']['dato_id'];
						$registros[] = $registro;
					}
				}
				if($v['DetalleDato']['identificador'] == "A") {
					$registro['A'] = $v['DetalleDato']['valor'] - $correccionLat;
					if($registro['A'] > $maxA) {
						$maxA = $registro['A'];
					}
					else {
						$minA = $registro['A'];
					}
				}
				elseif($v['DetalleDato']['identificador'] == "B") {
					$registro['B'] = $v['DetalleDato']['valor'] - $correccionLon;
					if($registro['B'] > $maxB) {
						$maxB = $registro['B'];
					}
					else {
						$minB = $registro['B'];
					}
				}
				elseif($v['DetalleDato']['identificador'] == $parametro) {
					/**
					* Hago las modificaciones en duro.
					*/
					switch($parametro) {
						case "D":
						case "E":
						case "F":
							$registro[$parametro] = number_format($v['DetalleDato']['valor'] / 1000, 3);
							break;
						case "O":
						case "I":
						case "G":
							$registro[$parametro] = number_format($v['DetalleDato']['valor'] / 10, 1);
							break;
						default:
							$registro[$parametro] = $v['DetalleDato']['valor'];
					}
				
					
					if($registro[$parametro] < $valorMinimo) {
						$valorMinimo = $registro[$parametro];
					}
					elseif($registro[$parametro] > $valorMaximo) {
						$valorMaximo = $registro[$parametro];
					}
				}
			}

			/**
			* Calculo el rango de las referencias.
			*/
			$incremento = ($valorMaximo - $valorMinimo) / 5;
			for($i=0;$i<5;$i++) {
				if(!empty($this->params['pass']['RangoInferior' . $colores[$i]])) {
					$rangos[$i]['min'] = str_replace(",", ".", $this->params['pass']['RangoInferior' . $colores[$i]]);
				}
				else {
					$rangos[$i]['min'] = $valorMinimo + ($incremento * $i);
				}
				if(!empty($this->params['pass']['RangoSuperior' . $colores[$i]])) {
					$rangos[$i]['max'] = str_replace(",", ".", $this->params['pass']['RangoSuperior' . $colores[$i]]);
				}
				else {
					$rangos[$i]['max'] = $valorMinimo + ($incremento * ($i+1));
				}
				
			}
			
			
			$centro['A'] = ($maxA + $minA) / 2;
			$centro['B'] = ($maxB + $minB) / 2;

			$time = time();
			$archivo = "mapa_" . $time . ".txt";
			$ruta_archivo = APP . DS . "webroot" . DS . "files" . DS . $archivo;

			/**
			* Saco los puntos que se superponen a muy poca distancia.
			*/
			$precision = 10 - $this->params['pass']['precision'];
			foreach($registros as $r=>$registro) {
				$d[substr($registro['A'], 0, $precision)][substr($registro['B'], 0, $precision)] = $registro;
			}
			$b= false;
			foreach($d as $k=>$v) {
				foreach($v as $registro) {
					foreach($rangos as $k1=>$rango) {
						if($registro[$parametro] >= $rango['min'] && $registro[$parametro] <= $rango['max']) {
							if($this->data['Mapa']['rango' . $colores[$k1]] == "true") {
								$registro['icono'] = $k1;
								$b = true;
							}
							else {
								$registro['icono'] = -1;
							}
						}
					}
					$lineas[] = implode(",", $registro);
				}
			}
			file_put_contents($ruta_archivo, join("\n", $lineas));

			$this->set("centro", $centro);
			$this->set("parametro", $parametro);
			$this->set("rangos", $rangos);
			$this->set("archivo", $archivo);
			$this->set("abierto", $this->params['pass']['abierto']);

			$this->set("colores", $colores);
			$this->set("info", $info);
			
			
		}
		else {
			$this->set("centro", array("A"=>"", "B"=>""));
			$this->set("abierto", 0);
		}
		//d("XXXX");
		$this->render("mapa", "ajax");
	}
	
/**
 * Index.
 *
 */
    function index()
    {
		$this->set('Usuario', $this->Session->read('Usuario'));
		
    	//d($this->params);
    	/*
		if($this->Session->check('Sim')) {
			$sim = $this->Session->read('Sim');
			$this->data['Filtro']['Dato-sim_id'] = $sim['Sim']['id'];
		}
		else {
			$this->Session->setFlash('Debe seleccionar un Modulo antes de continuar.', 'error');
			$this->redirect("../sims/seleccionar", null, true);
		}
		*/
		
		/*
		$usuario = $this->Session->read('Usuario');
		if ($usuario['Grupo']['id'] != 1) { // si no es un administrador
			if(empty($usuario['Usuario']['usuario_id'])) //es un padre, ve todos los sucesos de el y de sus hijos
			{
				$this->data['Filtro']['Suceso-usuario_id'] = $usuario['Usuario']['id'];
				$this->set('clientes', $this->Suceso->Usuario->generateList(array("usuario_id"=>$usuario['Usuario']['id']), null, null, null, "{n}.Usuario.nombre"));
			}
			else { //es un hijo, solo ve los sucesos de el
				if(!empty($usuario['Usuario']['numero_asociado'])) {
					$this->data['Filtro']['Suceso-cliente_id'] = $usuario['Usuario']['id'];
				}

				if(!empty($usuario['Usuario']['fecha_hora_desde']) && $usuario['Usuario']['fecha_hora_desde'] <> "0000-00-00 00:00:00") {
							$this->data['Filtro']['Suceso-fecha_hora__desde'] = $this->Formato->formatearFechaHora($usuario['Usuario']['fecha_hora_desde']);
				}
				if(!empty($usuario['Usuario']['fecha_hora_hasta']) && $usuario['Usuario']['fecha_hora_hasta'] <> "0000-00-00 00:00:00") {
						$this->data['Filtro']['Suceso-fecha_hora__hasta'] = $this->Formato->formatearFechaHora($usuario['Usuario']['fecha_hora_hasta']);
				}
			}
		}
		else {
			$this->set('puedeEliminar', "true");
		}
		*/
		//$this->data['Filtro']['Dato-tipo'] = "E";
		if(!empty($this->data)) {
			
			/*
			$ant = array();
			foreach(array('__desde', '__hasta') as $v) {
				if(!empty($this->data['Filtro']['Dato-fecha_hora' . $v])) {
					$ant['Dato-fecha_hora' . $v] = $this->data['Filtro']['Dato-fecha_hora' . $v];
					$tmp = explode(" ", $this->data['Filtro']['Dato-fecha_hora' . $v]);
					if(!empty($tmp['0'])) {
						$this->data['Filtro']['Dato-fecha' . $v] = $tmp['0'];
					}
					if(!empty($tmp['1'])) {
						$this->data['Filtro']['Dato-hora' . $v] = $tmp['1'];
					}
					unset($this->data['Filtro']['Dato-fecha_hora' . $v]);
				}
			}
			$condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
			foreach($ant as $k=>$v) {
				$this->data['Filtro'][$k] = $v;
			}
			*/
			$condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
			$this->paginate['conditions'] = $condicion;
		}
		
		$this->paginate['order'] = "fecha_hora_recepcion desc";

		if(!empty($this->data['Filtro']['accion']) && $this->data['Filtro']['accion'] == "busqueda_excel") {
			$this->paginate['limit'] = 1000000;

			/*
			$this->Dato->DetalleDato->expects();
			$dato = $this->Dato->DetalleDato->findAll(array("DetalleDato.dato_id"=>$archivo_id));
			$this->Dato->DetalleDato->expects();
			$datos = $this->Dato->DetalleDato->findAll(array("DetalleDato.encabezado_dato_id"=>$archivo_id), null, "DetalleDato.id");
			$datos = am($dato, $datos);
			*/
			
			$this->data['Filtro']['Dato-dato_id'] = "0";
			$condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
			$this->paginate['conditions'] = $condicion;
			$datos = $this->paginate();
			foreach($datos as $dato) {
				//d($dato);
				$d[] = $dato['DetalleDato'];
				$ids = $dato['Dato']['id'];
			}
			$this->Dato->DetalleDato->expects();
			$detalles = $this->Dato->DetalleDato->findAll(array("DetalleDato.encabezado_dato_id"=>$ids), null, "DetalleDato.id");

			foreach($d as $v) {
				foreach($v as $v1) {
					array_unshift($detalles, array("DetalleDato"=>$v1));
				}
			}

			foreach($detalles as $k=>$v) {
				if($v['DetalleDato']['encabezado_dato_id'] == 0) {
					$registros[$v['DetalleDato']['dato_id']][$v['DetalleDato']['identificador']] = $v['DetalleDato'];
				}
				else {
					$registros[$v['DetalleDato']['encabezado_dato_id']][$v['DetalleDato']['identificador']] = $v['DetalleDato'];
				}
			}

			$registros = $this->__generarArchivo($registros);
			
			$archivo = "archivo_" . date("d-m-Y") . "-" . count($registros) . ".csv";
			$ruta_archivo = APP . DS . "webroot" . DS . "files" . DS . $archivo;
			file_put_contents($ruta_archivo, join("\r\n", $registros));
			$this->set('ruta_archivo', $ruta_archivo);
			$this->Session->write('nombreArchivo', $ruta_archivo);
			$this->layout = "texto";
			$this->render("descargar");
		}
		else {
			$registros =  $this->paginate();
			$this->set('tipos_dato', array("E"=>"Encabezado", "D"=>"Detalle", "T"=>"Cierre", "I"=>"Informacion"));
			$this->set('registros', $registros);
		}
    }



function __generarArchivo($registros) {
	if(!empty($registros)) {
		$parametros = $this->Parametro->findAll(array("orden"=>">0"), null, "orden");
		$l = 0;
		foreach($registros as $k=>$v) {
			foreach($parametros as $k1=>$parametro) {
				$id = $parametro['Parametro']['identificador'];
				if(isset($v[$id])) {
					/**
					* Hago las modificaciones en duro.
					*/
					switch($id) {
						case "D":
						case "E":
						case "F":
							$v[$id]['valor'] = number_format($v[$id]['valor'] / 1000, 3);
							break;
						case "O":
						case "I":
						case "G":
							$v[$id]['valor'] = number_format($v[$id]['valor'] / 10, 1);
							break;
					}
					$columnas[$id] = $v[$id]['valor'];
				}
				elseif(isset($lineas[$l - 1][$id])) {
					$columnas[$id] = $lineas[$l - 1][$id];
				}
				else {
					$columnas[$id] = "0";
				}
			}

			$lineas[] = $columnas;
			$columnas = array();
			$l++;
		}

		$registros = array();
		foreach($parametros as $k1=>$parametro) {
			$params[] = $parametro['Parametro']['nombre'];
		}
		$registros[] = implode(",", $params);
		/**
		* Saco el encabezado
		*/
		array_shift($lineas);
		foreach($lineas as $linea) {
			$registros[] = implode(",", $linea);
		}
		return $registros;
	}
	else
		return array();
}

	function detalles($dato_id = false) {
        if ($dato_id&& is_numeric($dato_id))
        {
			$this->Dato->recursive = 2;
			$datos = $this->Dato->read(null, $dato_id);
            $this->set("registros", $datos);
			$this->render("detalles", "ajax");
        }   
	}

/**
 * View.
 *
 */
   function view($id = false) 
   {
		if(!empty($this->params['pass']['detalleDato'])) {
			$id = $this->params['pass']['detalleDato'];
			$id--;
		}
        if ($id && is_numeric($id))
        {
			$this->Dato->recursive = 2;
			$this->data = $this->Dato->read(null, $id);
        }
   }  
	

function datediff($interval, $datefrom, $dateto, $using_timestamps = false) {
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/

if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
$difference = $dateto - $datefrom; // Difference in seconds

switch($interval) {

case 'yyyy': // Number of full years

$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;

case "q": // Number of full quarters

$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;

case "m": // Number of full months

$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;

case 'y': // Difference between day numbers

$datediff = date("z", $dateto) - date("z", $datefrom);
break;

case "d": // Number of full days

$datediff = floor($difference / 86400);
break;

case "w": // Number of full weekdays

$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;

case "ww": // Number of full weeks

$datediff = floor($difference / 604800);
break;

case "h": // Number of full hours

$datediff = floor($difference / 3600);
break;

case "n": // Number of full minutes

$datediff = floor($difference / 60);
break;

default: // Number of full seconds (default)

$datediff = $difference;
break;
}

return $datediff;

}
	
}
?>